#include <iostream>
#include <regex>

int main()
{
    // HTTP请求行:  GET /zzy/login?username=zhangsan&password=123456 HTTP/1.1\r\n
    std::string str = "get /zzy/login?username=zhangsan&password=123456 HTTP/1.1\r\n";
    std::regex e("(GET|HEAD|PUT|DELETE|POST) ([^?]*)(?:\\?(.*))? (HTTP/1\\.[01])(?:\n|\r\n)?", std::regex::icase); // .表示除了\r\n的任意字符，*表示0到多个字符
    // GET|HEAD|PUT|DELETE|POST 表示匹配任意一个字符串
    // [^?]* 其中[^?]表示反向匹配除了？的字符，*表示匹配0个或多个
    // \\? 表示?   .*表示匹配除\r\n的0个或任意多个字符直到遇到空格
    // (?:...) 表示匹配字符串但是不提取  最后的?表示匹配前面的表达式0次或1次
    // 但是可能不携带参数，因此需要给\\?(.*)加上 (\\?(.*))?
    // 同时我们不提取问号，所以在前面再加上?: ->  (?:\\?(.*))?
    // std::regex::icase忽略大小写
    std::smatch matches;
    bool ret = regex_match(str, matches, e);
    if (ret == false)
        return -1;
    for (int i = 0; i < matches.size(); i++)
    {
        std::cout << i << ": " << matches[i] << std::endl;
    }

    std::string method = matches[1];
    std::cout << method << std::endl;
    std::transform(method.begin(), method.end(), method.begin(), ::toupper);
    std::cout << method << std::endl;

    return 0;
}